使用KMS对接全密态MySQL EncJDBC

全密态MySQL数据库的安全核心在于密钥MEK管理,您可以使用阿里云KMS便捷、安全地托管和获取MEK。本文介绍如何使用阿里云KMS接入全密态MySQL EncJDBC,以完成对全密态MySQL密钥的托管。

背景

全密态MySQL数据库的MEK(Master Encryption Key)由客户端通过安全的非对称加密协议传输给数据库服务端,使服务端、客户端具有相同的密钥,从而通过对称加密安全传输数据。MEK的保存和管理对全密态MySQL数据库的安全性非常重要。我们推荐使用阿里云KMS来完成MEK的托管和获取操作。

阿里云KMS(Key Management Service)是阿里云针对云上数据加密需求精心设计的密码应用服务,主要提供密钥管理和凭据管理。针对全密态MySQL数据库,我们使用凭据管理来托管用户的MEK。防止凭据硬编码带来泄露风险,提高数据安全性。

前提条件

  • 已开通全密态功能,详情请参见开通全密态功能

  • 已完成EncJDBC客户端接入全密态数据库的相关配置,详情请参见EncJDBC

  • EncJDBC的版本大于或等于1.0.6。

  • 已创建KMS实例,详情请参见购买和启用KMS实例

影响

KMS服务不可用,全密态客户端驱动EncJDBC也无法使用。

费用

该功能RDS不收费,KMS凭据托管功能收费,详情请参见产品计费

操作步骤

使用阿里云KMS对接全密态MySQL数据库的步骤如下:

  1. 生成MEK。

    说明

    MEK是一个128位的密钥,我们可以用各种工具生成,包括OpenSSL、阿里云KMS等。

  2. 利用凭据管理服务将MEK托管到阿里云KMS。

  3. 配置EncJDBC,接入阿里云KMS。

步骤一:生成MEK

本功能需要生成一个128位的密钥,用32位的十六进制字符串表示。例如,00112233445566778899aabbccddeeff。

您可以使用OpenSSL工具或KMSGenerateDataKey接口生成密钥:

  • 使用OpenSSL工具:

    • Linux系统自带OpenSSL工具,执行openssl rand -hex 16,生成密钥。

    • Windows系统,请安装OpenSSL软件包

  • 使用KMSGenerateDataKey接口:

    在调用接口时,您需要指定一个KMS主密钥ID,以及指定NumberOfBytes(生成的密钥长度)为16。

    image

    调用结果中的plaintext即为Base64编码的随机128位密钥,后续使用时还需自行转换为十六进制字符串格式。

步骤二:将MEK托管到阿里云KMS

您可以在KMS控制台或者使用KMS OpenAPI完成MEK的托管:

重要

托管前,请确认您的MEK是一个十六位的十六进制字符串。

  • KMS控制台托管

    1. 进入KMS控制台的凭据管理页面。

    2. 单击创建凭据,单击通用凭据,填入凭据名称,在设置凭据值右侧单击纯文本并填入已生成的MEK,版本号可以自选也可以使用默认值。

    3. 单击下一步,再单击下一步

    4. 确认凭据配置信息后,单击确定

      说明

      完成上述步骤后,您的MEK就已经加密后安全地保存在了阿里云KMS。请记住您的凭据名称和版本号,后续需要使用这些信息在客户端导入MEK。

  • 使用KMS OpenAPI托管

    您可以调用CreateSecret接口将MEK托管到阿里云KMS。

步骤三:将全密态MySQL EncJDBC接入阿里云KMS

  1. pom.xml文件中添加依赖。

    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>alibabacloud-kms20160120</artifactId>
        <version>1.0.5</version>
    </dependency>
  2. 配置MEK。

    EncJDBC中介绍了直接配置MEK的方法,这里介绍通过阿里云KMS配置MEK的方法。

    配置时需要设置五个值,分别为:ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRETKMS_SECRET_NAMEKMS_REGION_IDKMS_SECRET_VERSION。这五个值分别为您的阿里云AKSK存储的凭据名称KMS所用的region以及凭据版本。其中KMS_SECRET_VERSION可以不设置,默认使用最新版本。

    您可以通过三种方式配置MEK,示例如下:

    • JDBC properties配置

      props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_ID", "xxx");
      props.setProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET", "xxx");
      props.setProperty("KMS_SECRET_NAME", "confidential-mysql");
      props.setProperty("KMS_REGION_ID", "hangzhou");
      props.setProperty("KMS_SECRET_VERSION", "v1"); // 可选
    • 配置文件设置

      ALIBABA_CLOUD_ACCESS_KEY_ID=xxx
      ALIBABA_CLOUD_ACCESS_KEY_SECRET=xxx
      KMS_SECRET_NAME=confidential-mysql
      KMS_REGION_ID=cn-hangzhou
      KMS_SECRET_VERSION=v1 # 可选

      该配置等价于您直接设置MEK:

      MEK=001122334455566778899aabbccddeeff
    • URL设置

      在使用URL配置时,需要在原有的URL串后加上:

      ALIBABA_CLOUD_ACCESS_KEY_ID=xxx&ALIBABA_CLOUD_ACCESS_KEY_SECRET=xxx&KMS_SECRET_NAME=confidential-mysql&KMS_REGION_ID=hangzhou

      例如:

      jdbc:mysql:encdb://hostname:port/db?ALIBABA_CLOUD_ACCESS_KEY_ID=xxx&ALIBABA_CLOUD_ACCESS_KEY_SECRET=xxx&KMS_SECRET_NAME=confidential-mysql&KMS_REGION_ID=hangzhou

以上配置方式和直接配置MEK的区别是,您不再需要自己手动管理MEK,而是由阿里云KMS通过凭据的方式进行托管。

相关文档

您可以通过EncJDBC文档,更好地理解EncJDBC的使用。